package com.utils;

import org.apache.ibatis.io.Resources;
import org.springframework.boot.web.servlet.MultipartConfigFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.util.unit.DataSize;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.util.Locale;
import java.util.Map;
import java.util.Properties;

import javax.servlet.MultipartConfigElement;

/**  文件保存工具类 */
@Configuration
public class FileUploadUtil {
  /** 图片保存的真实根路径 */
  public static String FILE_REAL_BASEDIR;

  /** 图片的访问路径前缀 */
  public static String FILE_ACCESS_PATH;

  /** 图片URL前缀 */
  public static String FILE_URL_PREFIX;

  /** 背景图片以及logo访问路径 */
  public static Map<String, String> INIT_PIC_URL;

  /** 允许上传成用户头像、商品封面的图片后缀 */
  public static String IMAGE_SUFFIX;

  /** 用户头像的子目录 */
  public static String USERS_IMAGES_SUBDIR;

  /** 商品图片封面的路径 */
  public static String GOODS_IMAGES_SUBDIR;

  /** 商品的更多图片的路径 */
  public static String GOODS_MORE_SUBDIR;

  /** 用户收款码子目录 */
  public static String QR_CODE_SUBDIR;

  /** 提现处理结果图片子目录 */
  public static String WITHDRAW_RESULT_SUBDIR;

  /** 商品举报证据截图的路径 */
  public static String GOOD_REPORT_SUBDIR;

  /** 用户反馈图片的目录 */
  public static String FEEDBACK_SUBDIR;

  /** 允许上传到商品更多的文件后缀 */
  public static String GOODS_MORE_SUFFIX;

  /** 允许添加商品更多图片的最大数量 */
  public static int MORE_FILE_MAX_COUNT;

  /** 上传单个图片的大小(单位是MB) */
  private static long SINGLE_MAX_SIZE;

  /** 上传图片的总大小(单位是GB) */
  private static long TOTAL_MAX_SIZE;

  /* 读取配置文件 */
  static {
    Properties pro = new Properties();
    try {
      pro.load(Resources.getResourceAsStream("fileUpload.properties"));
    } catch (IOException e) {
      e.printStackTrace();
    }
    FILE_REAL_BASEDIR = pro.getProperty("fileRealBaseDir");
    FILE_ACCESS_PATH = pro.getProperty("fileAccessPath");
    FILE_URL_PREFIX = pro.getProperty("fileURLPrefix");
    String initPicURL = pro.getProperty("initPicURL");
    INIT_PIC_URL = MapParser.parse(initPicURL);

    IMAGE_SUFFIX = pro.getProperty("imageSuffix");
    USERS_IMAGES_SUBDIR = pro.getProperty("usersImagesSubDir");
    GOODS_IMAGES_SUBDIR = pro.getProperty("goodsImagesSubDir");
    GOOD_REPORT_SUBDIR = pro.getProperty("goodReportSubDir");
    GOODS_MORE_SUBDIR = pro.getProperty("goodsMoreSubDir");
    QR_CODE_SUBDIR = pro.getProperty("qrCodeSubDir");
    WITHDRAW_RESULT_SUBDIR = pro.getProperty("withdrawResultSubDir");
    FEEDBACK_SUBDIR = pro.getProperty("feedbackSubDir");

    GOODS_MORE_SUFFIX = pro.getProperty("goodsMoreSuffix");

    MORE_FILE_MAX_COUNT = Integer.parseInt((String) pro.get("moreFileMaxCount"));
    SINGLE_MAX_SIZE = Long.parseLong((String) pro.get("singleMaxSize"));
    TOTAL_MAX_SIZE = Long.parseLong((String) pro.get("totalMaxSize"));
  }

  /**
   * 上传文件
   *
   * @param file 文件
   * @param fileName 文件名，就是随机生成的36位的UUID
   * @param subDir 子目录名称
   * @param allowedSuffix 文件允许的后缀名
   * @return 若文件后缀正确且稳健保存成功返回url,否则返回null
   */
  public static String uploadFile(
      MultipartFile file, String fileName, String subDir, String allowedSuffix) {
    if (file == null) {
      return null;
    }
    String fct = file.getContentType();
    System.out.println("contentType:" + fct);
    if (fct == null) {
      return null;
    }
    // 文件后缀
    String fileSuffix = fct.substring(fct.lastIndexOf("/") + 1).toLowerCase(Locale.ROOT);
    System.out.println("fileSuffix:" + fileSuffix);
    if (!allowedSuffix.contains(fileSuffix)) {
      // 如果文件类型不允许，返回空
      return null;
    }
    StringBuilder filePath = new StringBuilder(70);
    // 真实图片的完整存放路径
    filePath.append(subDir).append(fileName).append(".").append(fileSuffix);
    String realPath = FileUploadUtil.FILE_REAL_BASEDIR + filePath;
    System.out.println("即将保存文件到" + realPath);
    File dest = new File(realPath);
    if (!dest.exists()) {
      try {
        dest.createNewFile();
      } catch (IOException e) {
        e.printStackTrace();
        return null;
      }
    }
    try {
      // 将文件转换到系统文件中
      file.transferTo(dest);
      System.out.println("保存成功");
    } catch (IOException e) {
      e.printStackTrace();
      // 转换失败就将刚才新创建的文件删除
      dest.delete();
      return null;
    }
    return FileUploadUtil.FILE_URL_PREFIX + filePath;
  }

  /** 如果文件存在删除文件且返回true,否则返回false */
  public static boolean delFile(String fileURL) {
    if (fileURL == null) {
      return false;
    }
    System.out.println("imageURL是：" + fileURL);
    // 把虚拟路径前缀去掉，得到实际路径
    String imageName = fileURL.substring(FileUploadUtil.FILE_URL_PREFIX.length());
    String realPath = FileUploadUtil.FILE_REAL_BASEDIR + imageName;
    System.out.println("realPath是：" + realPath);
    File image = new File(realPath);
    if (image.exists()) {
      return image.delete();
    }
    return false;
  }

  /** 上传文件大小及个数限制 */
  @Bean
  public MultipartConfigElement multipartConfigElement() {
    MultipartConfigFactory factory = new MultipartConfigFactory();
    // 单个文件大小限制
    factory.setMaxFileSize(DataSize.ofMegabytes(SINGLE_MAX_SIZE));
    // 设置总上传数据大小
    factory.setMaxRequestSize(DataSize.ofGigabytes(TOTAL_MAX_SIZE));

    return factory.createMultipartConfig();
  }
}
